package view;

import dao.OrderDAO;
import model.Admin;
import model.Order;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

/**
 * 订单管理界面类，提供订单管理功能
 */
public class OrderManageFrame extends JFrame {
    private OrderDAO orderDAO;         // 订单数据访问对象
    private JTable orderTable;         // 订单表格
    private DefaultTableModel tableModel; // 表格模型
    private JComboBox<String> statusComboBox; // 订单状态下拉框
    private JButton updateButton;       // 更新订单状态按钮
    private JButton backButton;        // 返回按钮

    /**
     * 构造方法，初始化订单管理界面
     */
    public OrderManageFrame() {
        orderDAO = new OrderDAO();

        // 设置窗口标题和大小
        setTitle("在线购物系统 - 订单管理");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // 创建面板并设置布局
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        // 创建表格模型
        tableModel = new DefaultTableModel();
        tableModel.addColumn("订单ID");
        tableModel.addColumn("用户ID");
        tableModel.addColumn("订单日期");
        tableModel.addColumn("总金额");
        tableModel.addColumn("状态");

        // 创建订单表格并设置表格模型
        orderTable = new JTable(tableModel);
        orderTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

        // 加载订单数据到表格
        loadOrders();

        // 创建表格滚动面板
        JScrollPane scrollPane = new JScrollPane(orderTable);

        // 创建输入面板并设置布局
        JPanel inputPanel = new JPanel();
        inputPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));

        // 创建订单状态标签和下拉框
        JLabel statusLabel = new JLabel("订单状态:");
        statusComboBox = new JComboBox<>();
        statusComboBox.addItem("待付款");
        statusComboBox.addItem("已付款");
        statusComboBox.addItem("已发货");
        statusComboBox.addItem("已完成");
        statusComboBox.addItem("已取消");

        // 创建更新订单状态按钮并添加事件监听器
        updateButton = new JButton("更新订单状态");
        updateButton.setPreferredSize(new Dimension(150, 30));
        updateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedRow = orderTable.getSelectedRow();
                if (selectedRow == -1) {
                    JOptionPane.showMessageDialog(OrderManageFrame.this, "请先选择要更新的订单！", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                int orderId = (Integer) orderTable.getValueAt(selectedRow, 0);
                String status = (String) statusComboBox.getSelectedItem();

                // 更新订单状态
                orderDAO.updateOrderStatus(orderId, status);

                // 更新成功提示
                JOptionPane.showMessageDialog(OrderManageFrame.this, "订单状态更新成功！", "成功", JOptionPane.INFORMATION_MESSAGE);

                // 刷新订单列表
                loadOrders();
            }
        });

        // 创建返回按钮并添加事件监听器
        backButton = new JButton("返回");
        backButton.setPreferredSize(new Dimension(100, 30));
        backButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 关闭订单管理界面，返回管理员主界面
                dispose();
                new AdminMainFrame(new Admin()); // 这里需要传递当前登录的管理员对象
            }
        });

        // 将组件添加到输入面板
        inputPanel.add(statusLabel);
        inputPanel.add(statusComboBox);
        inputPanel.add(updateButton);
        inputPanel.add(backButton);

        // 将表格滚动面板和输入面板添加到面板
        panel.add(scrollPane, BorderLayout.CENTER);
        panel.add(inputPanel, BorderLayout.SOUTH);

        // 将面板添加到窗口
        add(panel);

        // 显示订单管理界面
        setVisible(true);
    }

    /**
     * 加载订单数据到表格
     */
    private void loadOrders() {
        // 清空表格
        tableModel.setRowCount(0);

        // 获取所有订单
        List<Order> orders = orderDAO.getAllOrders();

        // 将订单数据添加到表格
        for (Order order : orders) {
            Object[] row = {
                    order.getOrderId(),
                    order.getUserId(),
                    order.getOrderDate(),
                    order.getTotalPrice(),
                    order.getStatus()
            };
            tableModel.addRow(row);
        }
    }
}